package com.yugao.fintech.draper.datascope.handler;

import com.alibaba.ttl.TransmittableThreadLocal;
import com.yugao.fintech.draper.datascope.annotation.DataScope;

import java.util.LinkedList;

/**
 * 数据权限注解上下文
 */
public class DataScopeContextHolder {

	/**
	 * ttl解决父子线程传值问题 由于存在方法的嵌套调用 所以使用List
	 */
	private static final ThreadLocal<LinkedList<DataScope>> DATA_SCOPE = TransmittableThreadLocal.withInitial(LinkedList::new);

	/**
	 * 获得当前的数据权限注解
	 * @return 数据权限 注解
	 */
	public static DataScope get() {
		return DATA_SCOPE.get().peekLast();
	}

	/**
	 * 入栈数据权限注解
	 * @param dataScope 数据权限注解
	 */
	public static void add(DataScope dataScope) {
		DATA_SCOPE.get().addLast(dataScope);
	}

	/**
	 * 出栈数据权限注解
	 */
	public static void remove() {
		DATA_SCOPE.get().removeLast();
		// 无元素时 清空 ThreadLocal
		if (DATA_SCOPE.get().isEmpty()) {
			DATA_SCOPE.remove();
		}
	}
}
